package homework.util;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

public class BigDecimalMath {

    public final static BigDecimal PI = new BigDecimal("3.14159265358979" +
            "32384626433832795028841971693993751058209749445923078164062862" +
            "08998628034825342117067982148086513282306647093844609550582231" +
            "72535940812848111745028410270193852110555964462294895493038196" +
            "44288109756659334461284756482337867831652712019091456485669234" +
            "60348610454326648213393607260249141273724587006606315588174881" +
            "52092096282925409171536436789259036001133053054882046652138414" +
            "69519415116094330572703657595919530921861173819326117931051185" +
            "48074462379962749567351885752724891227938183011949129833673362" +
            "44065664308602139494639522473719070217986094370277053921717629" +
            "31767523846748184676694051320005681271452635608277857713427577" +
            "89609173637178721468440901224953430146549585371050792279689258" +
            "92354201995611212902196086403441815981362977477130996051870721" +
            "13499999983729780499510597317328160963185950244594553469083026" +
            "42522308253344685035261931188171010003137838752886587533208381" +
            "42061717766914730359825349042875546873115956286388235378759375" +
            "19577818577805321712268066130019278766111959092164201989380952" +
            "57201065485863278865936153381827968230301952035301852968995773" +
            "62259941389124972177528347913151557485724245415069595082953311" +
            "68617278558890750983817546374649393192550604009277016711390098" +
            "48824012858361603563707660104710181942955596198946767837449448" +
            "25537977472684710404753464620804668425906949129331367702898915" +
            "21047521620569660240580381501935112533824300355876402474964732" +
            "63914199272604269922796782354781636009341721641219924586315030" +
            "28618297455570674983850549458858692699569092721079750930295532" +
            "11653449872027559602364806654991198818347977535663698074265425" +
            "27862551818417574672890977772793800081647060016145249192173217" +
            "21477235014144197356854816136115735255213347574184946843852332" +
            "39073941433345477624168625189835694855620992192221842725502542" +
            "56887671790494601653466804988627232791786085784383827967976681");

    public static BigDecimal sqrt(BigDecimal num) {
        BigDecimal _2 = new BigDecimal("2");
        int precision = 100;
        MathContext mc = new MathContext(precision, RoundingMode.HALF_UP);
        if(num.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        BigDecimal result = num;
        for (int i=0;i < 100;i++) {
            result = (result.add(num.divide(result, mc))).divide(_2, mc);
        }
        return result;
    }

    public static BigDecimal formatDecimal(BigDecimal n) {
        int scale = n.scale();
        for(scale--;scale>=0;scale--) {
            if(n.compareTo(n.setScale(scale, RoundingMode.HALF_UP)) != 0) {
                break;
            }
        }
        return n.setScale(scale+1);
    }

    public static BigDecimal formatDecimal(BigDecimal n, int scale) {
        return formatDecimal(n.setScale(scale, RoundingMode.HALF_UP));
    }
}
